package com.bage.finance.biz.service;

import com.bage.finance.biz.domain.Subject;
import com.bage.finance.biz.dto.form.*;
import com.bage.finance.biz.dto.vo.GetSubjectDetailVo;
import com.bage.finance.biz.dto.vo.GetSubjectVo;
import com.bage.finance.biz.dto.vo.ListSubjectByCateAndCodeAndNameVo;
import com.bage.finance.biz.dto.vo.ListSubjectVo;
import com.fasterxml.jackson.core.JsonProcessingException;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;
import java.util.Set;

public interface SubjectService {
    /**
     * 查询科目列表
     * @param form
     * @return
     */
    List<ListSubjectVo> list(ListSubjectForm form);

    /**
     * 创建科目
     * @param form
     * @return
     */
    Boolean create(CreateSubjectForm form);

    /**
     * 查询科目列表
     * @param pid
     * @return
     */
    GetSubjectVo getByPid(Long pid) throws JsonProcessingException;

    /**
     * 查询科目
     * @param id
     * @return
     */
    GetSubjectVo get(Long id) throws JsonProcessingException;

    /**
     * 禁用或启用科目
     * @param form
     * @return
     */
    Boolean disable(DisableSubjectForm form);

    /**
     * 修改币别
     * @param form
     * @return
     */
    Boolean update(UpdateSubjectForm form);

    /**
     * 导出科目
     * @param response
     */
    void download(HttpServletResponse response) throws IOException;

    /**
     * 查询科目列表
     * @param form
     * @return
     */
    List<ListSubjectByCateAndCodeAndNameVo> list(ListSubjectByCateAndCodeAndNameForm form);

    /**
     * 查询科目详情
     * @param id
     * @return
     */
    GetSubjectDetailVo getDetail(Long id) throws JsonProcessingException;

    /**
     * 查询科目列表
     * @param ids
     * @param tenantId
     */
    List<GetSubjectVo> list(Set<Long> ids, Long tenantId);

    /**
     * 增加科目使用计数
     * @param id
     * @param count
     */
    boolean addUseCount(Long id, int count);

    /**
     * 减少科目使用计数
     * @param id
     * @param count
     */
    boolean deductUseCount(Long id, int count);

    /**
     * 查询id、编码、名称
     * @param ids
     * @return
     */
    List<Subject> listIdAndCodeAndName(Set<Long> ids);

    /**
     * 获取科目全名称（含父级名称）
     * @param subjects
     * @return
     */
    Map<Long, String> getSubjectFullName(List<Subject> subjects);

    /**
     * 获取科目全名称（含父级名称）
     * @param subjects
     * @return
     */
    Map<Long, List<Subject>> getParentSubjectList(List<Subject> subjects);

    /**
     * 删除科目
     * @param form
     * @return
     */
    Boolean del(DelForm form);
}
